//ignor

import 'dart:async';

import 'package:flutter/foundation.dart';

/**
 * 异步，多线程 相结合
 */
void main() {
  ///无序异步，箭头函数包含return
  // isoLoadFufunc();
  ///等于isoLoadFufunc()
  // isoLoadFufunc3();

  // isoLoadFufunc2();
  // isoLoadFufunc4();
  // isoLoadFufunc5();

  ///异步，微任务结合
  // test1();

  ///Timer默认开启一个异步任务
  timerTest();
}

int _count = 0;
Timer? _timer;

void timerTest() {
  _timer = Timer.periodic(Duration(seconds: 1), (timer) {
    _count++;
    print(_count);
    if (_count == 99) {
      ///必须销毁
      timer.cancel();
    }
  });

  if (_timer!.isActive) {
    _timer!.cancel();
  }
}

/**
 * I/flutter (31631): 异步任务1
    I/flutter (31631): 微任务2
    I/flutter (31631): 完毕
    I/flutter (31631): 微任务1
 */
void test1() {
  Future x = Future(() {
    print('异步任务1');
    scheduleMicrotask(() {
      print('微任务1');
    });
  });
  x.then((value) {
    print('微任务2');
  });
  x.whenComplete(() {
    print('完毕');
  });
}

/**   多线程执行，无序异步
 *
 *  I/flutter (31631): 1结束
    I/flutter (31631): 5结束
    I/flutter (31631): 2结束
    I/flutter (31631): 3结束
    I/flutter (31631): 4结束
 */
void isoLoadFufunc() {
  Future(() => compute(func, 123)).then((value) => print('1结束'));
  Future(() => compute(func, 123)).then((value) => print('2结束'));
  Future(() => compute(func, 123)).then((value) => print('3结束'));
  Future(() => compute(func, 123)).then((value) => print('4结束'));
  Future(() => compute(func, 123)).then((value) => print('5结束'));
}

/**
 * 有序同步()
 *
 *  I/flutter (31631): 1结束
    I/flutter (31631): 2结束
    I/flutter (31631): 3结束
    I/flutter (31631): 4结束
    I/flutter (31631): 5结束
 *
 */
void isoLoadFufunc2() {
  Future(() {
    compute(func, 123);
  }).then((value) => print('1结束'));
  Future(() {
    compute(func, 123);
  }).then((value) => print('2结束'));
  Future(() {
    compute(func, 123);
  }).then((value) => print('3结束'));
  Future(() {
    compute(func, 123);
  }).then((value) => print('4结束'));
  Future(() {
    compute(func, 123);
  }).then((value) => print('5结束'));
}

/**
 * 等于isoLoadFufunc
 *
 *  I/flutter (31631): 1结束
    I/flutter (31631): 3结束
    I/flutter (31631): 2结束
    I/flutter (31631): 4结束
    I/flutter (31631): 5结束
 */
void isoLoadFufunc3() {
  Future(() {
    return compute(func, 123);
  }).then((value) => print('1结束'));
  Future(() {
    return compute(func, 123);
  }).then((value) => print('2结束'));
  Future(() {
    return compute(func, 123);
  }).then((value) => print('3结束'));
  Future(() {
    return compute(func, 123);
  }).then((value) => print('4结束'));
  Future(() {
    return compute(func, 123);
  }).then((value) => print('5结束'));
}

/**
 *  I/flutter (31631): 1 来了
    I/flutter (31631): 2 来了
    I/flutter (31631): 3 来了
    I/flutter (31631): 4 来了
    I/flutter (31631): 5 来了
    I/flutter (31631): 1结束
    I/flutter (31631): 3结束
    I/flutter (31631): 2结束
    I/flutter (31631): 4结束
    I/flutter (31631): 5结束
 */
void isoLoadFufunc4() {
  Future(() {
    print('1 来了');
    return compute(func, 123);
  }).then((value) => print('1结束'));
  Future(() {
    print('2 来了');
    return compute(func, 123);
  }).then((value) => print('2结束'));
  Future(() {
    print('3 来了');
    return compute(func, 123);
  }).then((value) => print('3结束'));
  Future(() {
    print('4 来了');
    return compute(func, 123);
  }).then((value) => print('4结束'));
  Future(() {
    print('5 来了');
    return compute(func, 123);
  }).then((value) => print('5结束'));
}

/**
 * I/flutter (31631): 1 来了
    I/flutter (31631): 1结束
    I/flutter (31631): 2 来了
    I/flutter (31631): 2结束
    I/flutter (31631): 3 来了
    I/flutter (31631): 3结束
    I/flutter (31631): 4 来了
    I/flutter (31631): 4结束
    I/flutter (31631): 5 来了
    I/flutter (31631): 5结束
 */
void isoLoadFufunc5() {
  //一个整体
  Future(() {
    print('1 来了');
    compute(func, 123);
  }).then((value) => print('1结束'));
  Future(() {
    print('2 来了');
    compute(func, 123);
  }).then((value) => print('2结束'));
  Future(() {
    print('3 来了');
    compute(func, 123);
  }).then((value) => print('3结束'));
  Future(() {
    print('4 来了');
    compute(func, 123);
  }).then((value) => print('4结束'));
  Future(() {
    print('5 来了');
    compute(func, 123);
  }).then((value) => print('5结束'));
}

FutureOr func(int message) {}
